home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSIFileTest.c < prev    next >
C/C++ Source or Header  |  1993-11-18  |  8KB  |  343 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIFileTest    -    Test plain files
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    28Mar92                                Language    :    MPW C
  6.                 14Jun92    MN    More tests
  7.                 13Jul92    MN    Test choose()
  8.                 25Jul92    MN    Isolated testing gear in GUSITest
  9.                 07Sep92    MN    RdLink()
  10.                 27Oct92    MN    Forgot to adapt it to dirent.h
  11.                 08Dec92    MN    Pwd()
  12.                 20Dec92    MN    Allow defaults for choose()
  13.                 18Jul93    MN    dirent -> struct dirent
  14.                 29Jul93    MN    scandir
  15. Last        :    29Jul93
  16. *********************************************************************/
  17.  
  18. #include <GUSI.h>
  19. #include <GUSITest.h>
  20. #include <Types.h>
  21. #include <dirent.h>
  22. #include <stdio.h>
  23. #include <fcntl.h>
  24. #include <sys/errno.h>
  25. #include <stdlib.h>
  26.  
  27. void Stat(char ch1, char ch2, const char * cmd)
  28. {
  29.     int             res;
  30.     struct stat    statbuf;
  31.     char            filename[80];
  32.  
  33.     if (sscanf(cmd, "%s", filename) != 1)
  34.         Usage(ch1, ch2);
  35.     else {
  36.         if (ch2 == 'l') {
  37.             cmd    =    "lstat";
  38.             res     =    lstat(filename, &statbuf);
  39.         } else {
  40.             cmd     =     "stat";
  41.             res     =    stat(filename, &statbuf);
  42.         }
  43.     
  44.         if (res)    {
  45.             printf("# %s(\"%s\") returned error %s\n", cmd, filename, Explain());
  46.         } else {
  47.             printf("# %s(\"%s\") =\n", cmd, filename);
  48.             DUMP(statbuf.st_dev,d);
  49.             DUMP(statbuf.st_ino,d);
  50.             DUMP(statbuf.st_mode,#o);
  51.             DUMP(statbuf.st_nlink,d);
  52.             DUMP(statbuf.st_uid,d);
  53.             DUMP(statbuf.st_gid,d);
  54.             DUMP(statbuf.st_rdev,d);
  55.             DUMP(statbuf.st_size,d);
  56.             DUMP(statbuf.st_atime,u);
  57.             DUMP(statbuf.st_mtime,u);
  58.             DUMP(statbuf.st_ctime,u);
  59.             DUMP(statbuf.st_blksize,d);
  60.             DUMP(statbuf.st_blocks,d);
  61.         }    
  62.         Where();
  63.     }
  64. }
  65.  
  66. void ChDir(char ch1, char ch2, const char * cmd)
  67. {
  68.     char            directory[80];
  69.  
  70.     if (sscanf(cmd, "%s", directory) != 1)
  71.         Usage(ch1, ch2);
  72.     else if (chdir(directory))    {
  73.         printf("# chdir(\"%s\") returned error %s\n", directory, Explain());
  74.         Where();
  75.     }
  76. }
  77.  
  78. void MkDir(char ch1, char ch2, const char * cmd)
  79. {
  80.     char            directory[80];
  81.  
  82.     if (sscanf(cmd, "%s", directory) != 1)
  83.         Usage(ch1, ch2);
  84.     else if (mkdir(directory))    {
  85.         printf("# mkdir(\"%s\") returned error %s\n", directory, Explain());
  86.         Where();
  87.     }
  88. }
  89.  
  90. void RmDir(char ch1, char ch2, const char * cmd)
  91. {
  92.     char            directory[80];
  93.  
  94.     if (sscanf(cmd, "%s", directory) != 1)
  95.         Usage(ch1, ch2);
  96.     else if (rmdir(directory))    {
  97.         printf("# rmdir(\"%s\") returned error %s\n", directory, Explain());
  98.         Where();
  99.     }
  100. }
  101.  
  102. void List(char, char ch2, const char * cmd)
  103. {
  104.     int                    count;
  105.     int                    i;
  106.     struct dirent **    entries;
  107.     char *                dirend;
  108.     char                    directory[80];
  109.     struct stat            statbuf;
  110.  
  111.     if (sscanf(cmd, "%s", directory) != 1)
  112.         strcpy(directory, ":");
  113.     
  114.     if ((count = scandir(directory, &entries, nil, nil)) < 0) {
  115.         printf("# scandir(\"%s\") returned error %s\n", directory, Explain());
  116.         goto error;
  117.     }
  118.     
  119.     printf("# directory \"%s\" =\n", directory);
  120.     
  121.     dirend = directory + strlen(directory);
  122.     if (dirend[-1] != ':')
  123.         *dirend++ = ':';
  124.     
  125.     for (i = 0; i < count; ++i)
  126.         if (ch2 == 's')
  127.             printf("#    %s\n", entries[i]->d_name);
  128.         else {
  129.             strcpy(dirend, entries[i]->d_name);
  130.             
  131.             if (lstat(directory, &statbuf)) 
  132.                 printf("# lstat(\"%s\") returned error %s\n", entries[i]->d_name, Explain());
  133.             else
  134.                 printf("#    %c %7d %s\n", 
  135.                     (statbuf.st_mode & S_IFMT) == S_IFREG ? 'F' :
  136.                     (statbuf.st_mode & S_IFMT) == S_IFDIR ? 'D' :
  137.                     (statbuf.st_mode & S_IFMT) == S_IFLNK ? 'L' : '?',
  138.                     statbuf.st_size,
  139.                     entries[i]->d_name);
  140.         }
  141.         
  142. error:
  143.     Where();
  144. }
  145.  
  146. void Type(char ch1, char ch2, const char * cmd)
  147. {
  148.     FILE *         fl;
  149.     char            line[500];
  150.     char            filename[80];
  151.  
  152.     if (sscanf(cmd, "%s", filename) != 1)
  153.         Usage(ch1, ch2);
  154.     else {
  155.         fl = fopen(filename, "r");
  156.         
  157.         if (!fl)
  158.             printf("# open(\"%s\") returned error %s\n", filename, Explain());
  159.         else {
  160.             printf("# \"%s\" =\n", filename);
  161.             while (fgets(line, 500, fl))
  162.                 fputs(line, stdout);
  163.         }
  164.         
  165.         fclose(fl);
  166.         
  167.         Where();
  168.     }
  169. }
  170.  
  171. void Edit(char ch1, char ch2, const char * cmd)
  172. {
  173.     FILE *         fl;
  174.     char            line[500];
  175.     char            filename[80];
  176.  
  177.     if (sscanf(cmd, "%s", filename) != 1)
  178.         Usage(ch1, ch2);
  179.     else {
  180.         fl = fopen(filename, "w");
  181.         
  182.         if (!fl)
  183.             printf("# open(\"%s\") returned error %s\n", filename, Explain());
  184.         else    {
  185.             printf("# Enter \"%s\", terminate with \".\"\n", filename);
  186.             while (fgets(line, 500, stdin))
  187.                 if (strcmp(line, ".\n"))
  188.                     fputs(line, fl);
  189.                 else 
  190.                     break;
  191.         
  192.             fclose(fl);
  193.         }
  194.     }
  195. }
  196.  
  197. void Rm(char ch1, char ch2, const char * cmd)
  198. {
  199.     char            filename[80];
  200.  
  201.     if (sscanf(cmd, "%s", filename) != 1)
  202.         Usage(ch1, ch2);
  203.     else if (remove(filename))    {
  204.         printf("# remove(\"%s\") returned error %s\n", filename, Explain());
  205.         Where();
  206.     }
  207. }
  208.  
  209. void Mv(char ch1, char ch2, const char * cmd)
  210. {
  211.     struct stat    statbuf;
  212.     char            oldfilename[80];
  213.     char            newfilename[80];
  214.  
  215.     if (sscanf(cmd, "%s %s", oldfilename, newfilename) != 2)
  216.         Usage(ch1, ch2);
  217.     else {
  218.         if (!stat(newfilename, &statbuf) && (statbuf.st_mode & S_IFMT) == S_IFDIR) {
  219.             char *    fn;
  220.             char *     next;
  221.             int         len     =     strlen(newfilename);
  222.             
  223.             /* Extract file name part from oldfilename */
  224.             for (fn = oldfilename; (next = strchr(fn, ':')) && next[1]; fn = next);
  225.             
  226.             if (newfilename[len-1] != ':')
  227.                 newfilename[len++-1] = ':';
  228.             
  229.             strcpy(newfilename+len, fn);
  230.         }
  231.         
  232.         if (rename(oldfilename, newfilename))    {
  233.             printf("# rename(\"%s\", \"%s\") returned error %s\n", oldfilename, newfilename, Explain());
  234.             Where();
  235.         }
  236.     }
  237. }
  238.  
  239. void Link(char ch1, char ch2, const char * cmd)
  240. {
  241.     char            oldfilename[80];
  242.     char            newfilename[80];
  243.  
  244.     if (sscanf(cmd, "%s %s", oldfilename, newfilename) != 2)
  245.         Usage(ch1, ch2);
  246.     else {        
  247.         if (symlink(oldfilename, newfilename))    {
  248.             printf("# symlink(\"%s\", \"%s\") returned error %s\n", oldfilename, newfilename, Explain());
  249.             Where();
  250.         }
  251.     }
  252. }
  253.  
  254. void RdLink(char ch1, char ch2, const char * cmd)
  255. {
  256.     char path[200];
  257.     char link[200];
  258.     int  len;
  259.  
  260.     if (sscanf(cmd, "%s", path) != 1)
  261.         Usage(ch1, ch2);
  262.     
  263.     len = readlink(path, link, 199);
  264.     
  265.     if (len < 0)
  266.         printf("# readlink(\"%s\") returned error %s\n", path, Explain());
  267.     else {
  268.         link[len] = 0;
  269.         printf("# readlink(\"%s\") returned \"%s\"\n", path, link);
  270.     }
  271.         
  272.     Where();
  273. }
  274.  
  275. void Pwd(char, char, const char *)
  276. {
  277.     char * buf;
  278.     
  279.     buf = getcwd(NULL, 1024);
  280.     
  281.     if (!buf)
  282.         printf("# getcwd() returned error %s\n", Explain());
  283.     else {
  284.         printf("# getcwd() returned \"%s\"\n", buf);
  285.         
  286.         free(buf);
  287.     }
  288.         
  289.     Where();
  290. }
  291.  
  292. void Choose(char ch1, char ch2, const char * cmd)
  293. {
  294.     int                flags;
  295.     int                len    =    250;
  296.     char                fType[5];
  297.     char                name[250];
  298.     sa_constr_file    constr;
  299.     
  300.     flags = ((ch1 == 'g') ? 0 : CHOOSE_NEW) | ((ch2 == 'f') ? 0 : CHOOSE_DIR);
  301.  
  302.     if (flags) {
  303.         if (sscanf(cmd, "%s", name) == 1)
  304.             flags |= CHOOSE_DEFAULT;
  305.     } else if (sscanf(cmd, "%s", fType) == 1) {
  306.         constr.numTypes    =    1;
  307.         constr.types[0]    =    *(OSType *) fType;
  308.     } else
  309.         constr.numTypes    =    -1;
  310.     
  311.     if (choose(AF_FILE, 0, "What's up ?", &constr, flags, name, &len))
  312.         printf("# choose(%d) returned error %s\n", flags, Explain());
  313.     else
  314.         printf("# choose(%d) returned \"%s\"\n", flags, name);
  315.         
  316.     Where();
  317. }
  318.  
  319. main(int argc, char ** argv)
  320. {
  321.     printf("GUSIFileTest        MN 25Jul92\n\n");
  322.  
  323.     COMMAND('s', 't', Stat,  "filename",             "Call stat() on a file");
  324.     COMMAND('s', 'l', Stat,  "filename",             "Call lstat() on a file");
  325.     COMMAND('c', 'd', ChDir, "directory",             "Call chdir()");
  326.     COMMAND('l', 's', List,  "[ directory ]",     "List a directory");
  327.     COMMAND('l', 'l', List,  "[ directory ]",     "List a directory with more info");
  328.     COMMAND('m', 'd', MkDir, "directory",            "Make a new directory");
  329.     COMMAND('r', 'd', RmDir, "directory",            "Delete an empty directory");
  330.     COMMAND('t', 'y', Type,  "filename",            "Type out the contents of a file");
  331.     COMMAND('e', 'd', Edit,  "filename",            "Enter the contents of a new file");
  332.     COMMAND('m', 'v', Mv,       "oldfile newfile",    "Rename/Move a file");
  333.     COMMAND('r', 'm', Rm,      "filename",            "Delete a file");
  334.     COMMAND('r', 'l', RdLink,"filename",            "Read symbolic link");
  335.     COMMAND('l', 'n', Link,  "oldfile newfile",    "Create a symbolic link");
  336.     COMMAND('g', 'f', Choose,"[ type ]",            "Let the user choose a file");
  337.     COMMAND('g', 'd', Choose,"[ default ]",        "Let the user choose a directory");
  338.     COMMAND('p', 'f', Choose,"[ default ]",        "Let the user create a file");
  339.     COMMAND('p', 'd', Choose,"[ default ]",        "Let the user create a directory");
  340.     COMMAND('p', 'w', Pwd,     "",                        "Print current directory");
  341.     
  342.     RunTest(argc, argv);
  343. }